<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 基本数据类型
  var a
  var b = 1
  var c = true
  var d = 'javascript'
  var e = null
  console.log(a, b, c, d, e)

  // 引用数据类型
  // 对象：键值对，值的类型任意
  var f = {
    location: 'Chengdu',
    num: 1
  }
  console.log(f, f.location, f.num)

  // 数组：可以存放任意类型的值
  var arr = [1, 2, 3, '4', null, undefined, true, b]
  console.log(arr)

  // 函数
  // 调用函数：函数名(需要传入的参数)
  // 1. function关键字 函数名 (参数列表){ 函数体 }
  function fn1() {
    console.log('函数被调用了')
  }
  fn1()

  // 2. var/let/const 函数名 = function关键字 (参数列表){ 函数体 } 相当于把函数赋值给了一个变量
  var fn2 = function (a) {
    console.log('函数接收到参数', a)
  }
  fn2(123)

  // 3. var/let/const 函数名 = (参数列表) => { 函数体 } 这种函数叫箭头函数或者是Lambda函数

  var fn3 = () => {
    console.log('箭头函数被调用了')
  }
  fn3()


  var aa = 1
  var bb = aa
  aa = 2
  console.log(aa, bb)
  console.log(aa == bb)


  var cc = [1, 2, 3]
  var dd = cc
  cc[0] = 100
  dd[1] = 200
  console.log(cc, dd)
  console.log(cc == dd)

  var aaa
  var aaa
  let bbb
  // let bbb // 错误：bbb已经被声明了

  const ccc = 1 // 错误：ccc没有被赋值/没有被初始化
  // ccc = 2 // 错误：给常量赋值


  console.log(ddd)
  var ddd // 把声明部分提升了
  ddd = 123 // 赋值部分不会提升
  console.log(ddd)

  fn4()
  function fn4() {
    console.log('fn4被调用了')
  }


  for (let i = 0; i < 3; i++) {
    // 块级作用域
    let j = 100
    console.log(j)
  }
  // console.log(i) // let定义的会报错
  // console.log(j) // let定义的会报错

  function fn5() {
    // 函数作用域
    var x = 1
    console.log(x)
  }
  fn5()
  // console.log(x) // 三种方式都会报错
</script>

</html>